// 定义生成账单的函数，接收两个参数：
// invoice：包含客户信息和演出列表的账单对象
// plays：包含所有演出信息的对象（以playID为键）
function statement(invoice, plays) {
    // 初始化总金额为0
    let totalAmount = 0;
    // 初始化积分总数为0
    let volumeCredits = 0;
    // 初始化账单结果字符串，开头显示客户名称
    let result = `Statement for ${invoice.customer}\n`;
    // 创建货币格式化函数，将数字格式化为美国美元格式（保留2位小数）
    const format = new Intl.NumberFormat("en-US",
        { style: "currency", currency: "USD",
            minimumFractionDigits: 2 }).format;

    // 遍历账单中的每个演出
    for (let perf of invoice.performances) {
        // 根据演出ID获取对应的演出信息
        const play = plays[perf.playID];
        // 初始化当前演出的金额为0
        let thisAmount = 0;

        // 根据演出类型计算当前演出的费用
        switch (play.type) {
            case "tragedy":  // 悲剧类型
                thisAmount = 40000;  // 基础费用40000（单位：分）
                // 如果观众数超过30人，超出部分每人加收1000分
                if (perf.audience > 30) {
                    thisAmount += 1000 * (perf.audience - 30);
                }
                break;
            case "comedy":  // 喜剧类型
                thisAmount = 30000;  // 基础费用30000（单位：分）
                // 如果观众数超过20人，加收10000分基础费 + 超出部分每人500分
                if (perf.audience > 20) {
                    thisAmount += 10000 + 500 * (perf.audience - 20);
                }
                // 无论人数多少，额外加收每人300分
                thisAmount += 300 * perf.audience;
                break;
            default:  // 未知类型时抛出错误
                throw new Error(`unknown type: ${play.type}`);
        }

        // 计算积分：观众数超过30人时，每超出1人增加1分
        volumeCredits += Math.max(perf.audience - 30, 0);
        // 喜剧类型额外积分：每5个观众增加1分（向下取整）
        if ("comedy" === play.type) volumeCredits += Math.floor(perf.audience / 5);

        // 将当前演出的费用信息添加到账单结果中
        // 注意：这里将分转换为美元（除以100）并格式化
        result += ` ${play.name}: ${format(thisAmount/100)} (${perf.audience} seats)\n`;
        // 累加当前演出费用到总金额
        totalAmount += thisAmount;
    }

    // 添加总金额信息到账单结果（转换为美元并格式化）
    result += `Amount owed is ${format(totalAmount/100)}\n`;
    // 添加总积分信息到账单结果
    result += `You earned ${volumeCredits} credits\n`;
    // 返回完整的账单字符串
    return result;
}

// 定义演出数据的JSON字符串（包含各演出的名称和类型）
const playsStr = `{
  "hamlet": {"name": "Hamlet", "type": "tragedy"},
  "as-like": {"name": "As You Like It", "type": "comedy"},
  "othello": {"name": "Othello", "type": "tragedy"}
}`;
// 将JSON字符串解析为JavaScript对象，便于访问演出信息
const plays = JSON.parse(playsStr);

// 定义账单数据的JSON字符串（包含客户信息和各演出的观看人数）
const invoicesStr = `[
  {
    "customer": "BigCo",
    "performances": [
      {
        "playID": "hamlet",
        "audience": 55
      },
      {
        "playID": "as-like",
        "audience": 35
      },
      {
        "playID": "othello",
        "audience": 40
      }
    ]
  }
]`;
// 将JSON字符串解析为JavaScript数组，便于访问账单信息
const invoices = JSON.parse(invoicesStr);

// 调用statement函数生成账单（传入数组中的第一个账单对象和演出信息）
const result = statement(invoices[0], plays);
// 在控制台打印生成的账单
console.log(result);